﻿// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动！任何基于本项目二次开发而产生的一切法律纠纷和责任，我们不承担任何责任！

using Admin.NET.Plugin.Easy.Wms.IServices.IStorageLocation;
using Admin.NET.Plugin.Easy.Wms.Services.StorageLocation.DTO;
using Admin.NET.Plugin.Easy.Wms.Util;
using Furion.FriendlyException;
using Mapster;

namespace Admin.NET.Plugin.Easy.Wms.Services.StorageLocation;

/// <summary>
/// 库位管理服务
/// </summary>
public class StorageLocationServices : BaseService.BaseServices<Easy_Wms_StorageLocationEntity>, IStorageLocationServices
{
    private readonly SqlSugarRepository<Easy_Wms_StorageLocationEntity> _storage = App.GetService<SqlSugarRepository<Easy_Wms_StorageLocationEntity>>();

    /// <summary>
    /// 添加库位
    /// </summary>
    /// <param name="input">输入参数</param>
    /// <returns></returns>
    public async Task Add(StorageLocationAddInput input)
    {
        // TODO：查重判断
        input.StorageLocation_Num = input.StorageLocation_Num.GenerateIfNullOrEmpty(() => GenerateNum.GeneratedNumber("STORAGE"));
        var entity = input.Adapt<Easy_Wms_StorageLocationEntity>();
        await _storage.InsertAsync(entity);
    }

    /// <summary>
    /// 删除库位
    /// </summary>
    /// <param name="input">id</param>
    /// <returns></returns>
    public async Task Delete(StorageLocationDeleteInput input)
    {
        // 判断能否删除，如果库位里面有库存，则不能删除
        var entity = await _storage.GetFirstAsync(x => x.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
        // 非假删除
        await _storage.DeleteAsync(entity);
    }

    /// <summary>
    /// 分页查询库位信息
    /// </summary>
    /// <param name="input">查询参数</param>
    /// <returns></returns>

    public async Task<SqlSugarPagedList<StorageLocationOutPut>> PageAsync(StorageLocationPageInput input)
    {
        var data = _storage.AsQueryable()
                 .WhereIF(!string.IsNullOrEmpty(input.StorageLocation_Num), x => x.StorageLocation_Num.Contains(input.StorageLocation_Num))
                 .WhereIF(!string.IsNullOrEmpty(input.StorageLocation_Name), x => x.StorageLocation_Name.Contains(input.StorageLocation_Name))
                 .WhereIF(!string.IsNullOrEmpty(input.StorageLocation_Type), x => x.StorageLocation_Type == input.StorageLocation_Type)
                 .WhereIF(input.StorageLocation_Status == Enum.Easy_Wms_GeneralStatusEnum.Enable, x => x.StorageLocation_Status == Enum.Easy_Wms_GeneralStatusEnum.Enable)
                 .WhereIF(input.StorageLocation_Status == Enum.Easy_Wms_GeneralStatusEnum.Disable, x => x.StorageLocation_Status == Enum.Easy_Wms_GeneralStatusEnum.Disable)
                 // TODO：需要测试才能知道能不能生效
                 .WhereIF(input.StorageLocation_Occupy != null, x => x.StorageLocation_Occupy == input.StorageLocation_Occupy)
                 .Select<StorageLocationOutPut>();

        return await data.ToPagedListAsync(input.Page, input.PageSize);

    }

    /// <summary>
    /// 修改库位信息
    /// </summary>
    /// <param name="input">输入参数</param>
    /// <returns></returns>
    public async Task Update(StorageLocationUpdateInput input)
    {
        // TODO：
        // 需要判断此库位当前有没有被占用
        var model = input.Adapt<Easy_Wms_StorageLocationEntity>();
        model.UpdateTime = DateTime.Now;
        await _storage.AsUpdateable(model).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();

    }
}
